package com.ssy.lingxi.member.merchant.service.base;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.member.merchant.entity.*;

import java.util.List;

/**
 * (内部)会员、用户菜单权限、数据权限、渠道权限服务接口实现类
 * @author 万宁
 * @version 2.0.0
 * @date 2020-09-15
 */
public interface IBaseAuthService {
    /**
     * 重新构建用户数据权限
     * @param member 会员
     * @return 操作结果
     */
    Wrapper<Void> rebuildMemberUserDataAuth(MemberDO member);

    /**
     * 合并会员权限
     * @param memberDO 会员
     * @return 合并结果
     */
    Wrapper<Void> mergeMemberAuthFromRelation(MemberDO memberDO);

    /**
     * 更新会员角色后，更新会员用户的权限
     * @param memberRoleDO 已经更新的会员角色
     * @return 更新结果
     */
    Wrapper<Void> updateMemberUserAuthByUpdateMemberRole(MemberRoleDO memberRoleDO);

    /**
     * 修改角色权限后，修改平台会员权限
     * @param roleDO 角色
     * @return 更新结果
     */
    Wrapper<Void> rebuildMemberAuthByUpdateRoleAuth(RoleDO roleDO);

    /**
     * 修改角色权限后，去掉会员、会员用户的权限中已经被去掉的权限
     * @param roleDO 角色
     * @return 更新结果
     */
    Wrapper<Void> updateMemberAuthByUpdateRoleAuth(RoleDO roleDO);

    /**
     * 修改用户角色的数据权限后，重新构建会员相关用户的数据权限
     * @param memberDO     会员
     * @param memberRoleDO 会员角色
     * @param orgList 会员组织机构列表
     */
    void rebuildMemberRoleDataAuth(MemberDO memberDO, MemberRoleDO memberRoleDO, List<MemberOrganizationDO> orgList);


    /**
     * 新增或修改业务员渠道权限后，根据组织机构层级，从上往下构建所有用户的渠道权限
     * @param memberUserDO 渠道权限发生变化的业务员
     */
    void rebuildUserChannelAuth(MemberUserDO memberUserDO);


    /**
     * 新增或修改用户时，当用户组织机构发生变化时，重新构建该用户的渠道权限
     * <p>用于MemberAbilityUserServiceImpl</p>
     * @param memberUserDO 当前用户
     * @param needSaveAndFlush 是否保存（新增用户时需要保存，修改用户时不需要保存）
     */
    void rebuildUserDataAndChannelAuth(MemberUserDO memberUserDO, boolean needSaveAndFlush);
}
